这个[ 知识回顾 ]系列文章,整合记录的是在掌握知识点中,所忽略的点、涉及的原理等;
0x00 前言
这篇文章将解释 PsExec
的使用条件、原理及背景知识。但不包括 PsExec
在通信时主要用到了 SMB
这个应用层协议( SMB
协商过程),想了解的请看 参考-1-2。
0x01 什么是 PsExec
PsExec
是由 Mark Russinovich
创建的 Sysinternals Suite 中包含的工具。最初,它旨在作为系统管理员的便利工具,以便他们可以通过在远程主机上运行命令来执行维护任务。PsExec
可以算是一个轻量级的 telnet 替代工具,它使您无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与命令控制台几乎相同的实时交互性。PsExec最强大的功能就是在远程系统和远程支持工具(如 ipconfig、whoami)中启动交互式命令提示窗口,以便显示无法通过其他方式显示的有关远程系统的信息。
0x02 工作原理
通过提供目标主机的地址,有效用户和密码,就可以远程控制计算机。
它的背后到底发生了些什么,我们来看看:
- 将
PSEXESVC.exe
上传到ADMIN$
(指向/admin$/system32/PSEXESVC.EXE
)共享文件夹内; - 远程创建用于运行
PSEXESVC.exe
的服务; - 远程启动服务。
PSEXESVC
服务充当一个重定向器(包装器)。它在远程系统上运行指定的可执行文件(事例中的是 cmd.exe
)。同时,它通过主机之间来重定向进程的输入/输出(利用命名管道)。
0x03 详细过程
- 使用提供的凭证,通过
SMB 会话
进行身份验证。 - 通过
SMB
访问默认共享文件夹ADMIN$
,并上载PSEXESVC.exe
; 打开
\\RDC\pipe\svcctl
的句柄,与服务控制管理器(SCM)
进行通信,这使得我们能够远程创建/启动服务。此时使用的是SVCCTL
服务,通过对SVCCTL服务
的DCE/RPC
调用来启动PsExec
;- 使用上传的
PSEXESVC.exe
作为服务二进制文件,调用CreateService 函数
; - 调用
StartServices 函数
; 正如下面的
Wireshark
所捕获到的数据,它是创建了命名管道来重定向 stdin(输入)、stdout(输出)、stderr(输出)。
总共创建了4个命名管道,一个用于服务本身,另外的管道用于重定向进程的 stdin、stdout、stderr。
0x04 使用 PsExec 的最低要求
1 | 1、远程机器的 139 或 445 端口需要开启状态,即 SMB; |
注意
1 | NTLM != NTLM v1/v2 ; |
在多数情况下,即使账号出现泄漏情况,使用 PsExec
, 也无法完成第4和第5点的要求,因为账号不是特权账号(RID500、域管理员)。
0x05 其他
日志分析:略